package com.neusoft.chenhanhua.d0921;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;

public class IoLiu {
	/*	File
	 * 		表示硬盘上的一个文件的类，有关于文件的基本信息，比如长度、创建、删除、路径信息等行为，不具备读写能力
	 * 	输入与输出流，是以电脑内存为参照的
	 * 		输入流：从硬盘文件读取内容到内存中，读
	 * 			字节流：以byte为单位，可以操作所有类型的文件，比如图片、文本文件、Office文档、电影视频等都可以
	 * 				InputStream，是所有输入流的abstract父类，真正干活的是子类
	 * 				常用子类
	 * 				FileInputStream
	 * 					FileInputStream(File file)
	 * 					FileInputStream(String name)
	 * 					read()：返回一个字节，了解即可
	 * 					read(byte[] bs)：将读取的内容保存在bs数组中
	 * 					read(byte[] bs, off, len)：off从哪里开始，读取len长度
	 * 					close()：关闭流，断开与硬盘文件的连接，释放内存资源，不关闭，不释放，除非程序停止
	 * 			字符流：以char为单位，只能操作文本文件，比较方便。
	 * 				Reader
	 * 				常用子类
	 * 				FileReader
	 * 			缓冲流：复制大文件时，提高效率
	 * 				BufferedInputStream
	 * 				BufferedReader
	 * 		输出流：从内存中写入内容到硬盘文件中，写
	 * 			字节流
	 * 				OutputStream，是所有输出流的abstract父类
	 * 				FileOutputStream
	 * 			字符流
	 * 				Writer
	 * 				FileWriter
	 * 			缓冲流
	 * 				BufferedOutputStream
	 * 				BufferedWriter
	 * 		IO流的效率与每次操作的数组大小有关
	 * 		转换流
	 * 			将字节流转换字符流
	 * 		中文乱码：
	 * 			1、编码不一致造成的
	 * 			2、数据库中的编码、Java连接数据库的编码、JSP页面的编码、Servlet的
	 * 			3、在GBK中文为2个字节，UTF-8是3个字节
	 * 	作业
	 * 		1、在API文档中查看IO流相关类
	 * 		2、分别使用字节流和字符流实现，文本文件、图片、视频，doc无图片，doc有图片的复制，
	 * 		3、在作业2的基础上理解字节流与字符的差异		
	 * 		4、封装一个File类，文件的创建、文件的复制、重命名
	 * 			
	 * 			
	 * 			
	 */
	public static void main(String[] args) {
		//t1();
		//t3();
		//t4();
		
	}
	public static void t1() {
		String path="files"+File.separator+"1.txt";
		try {
			FileInputStream fies=new FileInputStream(path);
			//数组长度不可变
			byte [] by=new byte[2];
			System.out.println(by);
			by=cd(path, by);
			System.out.println(by);
			fies.read(by);
			System.out.println(new String(by));
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}
	public static byte[] cd(String path,byte[] by) {
		File f1=new File(path);
		int q=(int)f1.length();
		int w=by.length;
		if (q>w) {
			//这里是已经重新创建一个数组了
			by=new byte[q];
		}
		return by;
	}
	public static void t2() {
		String path = "files" + File.separator + "1.txt";//该代码不会触发异常，可以不放try语句中
		FileInputStream fis = null;
		try {
			fis = new FileInputStream(path);//该代码会触发异常，所以必须放在try语句中
//			int input = fis.read();
//			System.out.println(input);//ASCII码值
//			System.out.println((char)input);
			byte[] b = new byte[3];//实际开发中，一般一次读取1KB
			int len = -1;//保存当前读取的长度
			while((len = fis.read(b)) != -1) {
				System.out.println(new String(b, 0, len));
//				System.out.println(new String(b));
			}
//			int len = fis.read(b);
//			System.out.println(new String(b));
//			System.out.println(len);
//			len = fis.read(b);
//			System.out.println(new String(b));
//			System.out.println(len);
//			len = fis.read(b);
//			System.out.println(new String(b));
//			System.out.println(len);
//			len = fis.read(b);
//			System.out.println(new String(b));
//			System.out.println(len);
//			len = fis.read(b);
//			System.out.println(new String(b));
//			System.out.println(len);
//			len = fis.read(b);
//			System.out.println(new String(b));
//			System.out.println(len);
			//在上面的基础上，实现读取整个文件，并打印？
			
//			fis.read(b, off, len)
		}  catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally {
			try {
				fis.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
//		catch (FileNotFoundException e) {
//			e.printStackTrace();
//		}
	}
	//正规IO写法
   public static void  t3() {
	   //1、准备文件路径
	   String path ="files" + File.separator+ "1.txt";
	   //2、定义流对象
	   FileInputStream fis=null;
	   try {
		   //3、初始化流对象
		fis=new FileInputStream(path);
		//4,定义读取数组
		byte[] b=new byte[3];//实际开发中，一般一次读取1kb
		int len=-1;//保存当前读取的长度
		//5、循环读取文件内容
		while ((len = fis.read(b)) != -1) {
			System.out.println(new String(b, 0, len));
		}
	} catch (IOException e) {
		e.printStackTrace();
	}finally {
		try {
			fis.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
   }
   //写
   public static void t4() {
	   String path ="files" + File.separator +"1.txt";
	   FileOutputStream fos=null;
	   try {
		fos=new FileOutputStream(path,true);
		fos.write("nihao".getBytes());
	} catch (IOException e) {
		e.printStackTrace();
	}finally {
		try {
			fos.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
   }
}
